#include <memory>
#include <iostream>

class B; //前向声明

class A {
public:
    std::weak_ptr<B> b_ptr; // A类持有B类的weak_ptr

    ~A() {
        std::cout << "A destructor" << std::endl;
    }
};

class B {
public:
    std::weak_ptr<A> a_ptr; // B类持有A类的weak_ptr

    ~B() {
        std::cout << "B destructor" << std::endl;
    }
};

int main() {
    std::shared_ptr<A> a = std::make_shared<A>();
    std::shared_ptr<B> b = std::make_shared<B>();
    
    a->b_ptr = b;
    b->a_ptr = a;
    
    // 此时a和b之间形成了循环引用，但由于使用了weak_ptr，不会形成内存泄漏

    return 0;
}

